let sessionid="";
let sessionData={};

//新建session
async function create(ctx) {
    sessionData={};//生成session过期时间
    sessionid=Date.now()
    sessionid+=5*1000;
    const buf = Buffer.from(sessionid.toString(), 'utf8');
    try{
        ctx.cookies.set('SSID',buf.toString('base64'),{//生成cookie值
            expires:(function(){
                return new Date(Date.now-1000*60);
            })()
        });
        await sessionDB.s.put(sessionData,sessionid);//写入leveldb
    }catch (e){}
}

//清除过期session
function clear() {
    var arr=[];
    var condition=sessionDB.s._prefix+sessionDB.s.interval+Date.now();
    //console.log('clear',condition,sessionData._id)
    sessionDB._DB_.createReadStream({
        lt:condition,
    }).on('data',function (res) {
        arr.push({ type: 'del', key:res.key })
    }).on('end',function () {
        sessionDB._DB_.batch(arr);
    });
}


/**
 * session管理
 * 获取  SESSION.字段名
 * 获取全部 SESSEION._ALL_
 * 设置  SESSEION.字段名=值
 */
module.exports= {
    sessionOperate: new Proxy(sessionData,{
        get: async function (target,k) {
            if(k=='_ALL_'){return sessionData;}
            return sessionData[k]?sessionData[k]:false;
        },
        set: async function (target,k,v) {
            if(k=='_ALL_')return;
            sessionData[k]=v;
            sessionDB.s.update(sessionid,sessionData);
        }
    }),
    init:async  function (ctx,next) {
        let ssid=ctx.cookies.get('SSID');
        if (ssid) {
            let buf = Buffer.from(ssid, 'base64');
            sessionid=buf.toString('utf8');
            if(sessionid>Date.now()){
                sessionData = await sessionDB.s.get(sessionid);
            }else{
                create(ctx);
            }
        } else {
            create(ctx);
        }
        if(Math.random()>0.9)clear();
       await next();
    }
}




